/**
 * @file 路径处理工具
 * @description 提供应用路径管理、URL构建和主题相关的工具函数
 * @author 黄敏
 * @version 1.0.0
 * @since 2025-08-12
 */

import type { BaseWindow } from 'electron'
import { dirname, join } from 'node:path'
import { fileURLToPath, pathToFileURL } from 'node:url'

import { app } from 'electron'
import { systemState, systemTheme } from 'global-state'

// ==================== 路径常量 ====================

// 计算基础路径
const __filename = fileURLToPath(import.meta.url)
const __dirname = dirname(__filename)

/** 主进程目录 */
export const DIST_ELECTRON = join(__dirname, '..')

/** 渲染进程目录 */
export const DIST = join(DIST_ELECTRON, './dist')

/** 公共资源目录 */
export const PUBLIC = app.isPackaged ? DIST : join(DIST_ELECTRON, './public')

/** 预加载脚本路径 */
const externalWebPreloadPath = join(DIST, 'preloads/externalWeb.cjs')
const internalWebPreloadPath = join(DIST, 'preloads/internalWeb.cjs')

/** 应用图标路径 */
export const ICON_PATH = join(PUBLIC, 'logo/logo.ico')

/** 基础根URL常量 - 在模块加载时计算一次，避免重复计算 */
export const BASE_ROOT_URL = (() => {
  if (process.env.VITE_DEV_SERVER_URL) {
    return process.env.VITE_DEV_SERVER_URL.replace(/\/$/, '')
  } else {
    // 将路径转换为 file:// URL 格式，并统一使用正斜线
    const normalizedPath = normalizePathSlashes(DIST)
    return pathToFileURL(normalizedPath).href
  }
})()

// ==================== 路径处理函数 ====================

/**
 * 将路径转换为统一的正斜线格式
 * @param path - 要标准化的路径
 * @returns 标准化后的路径
 */
function normalizePathSlashes(path: string): string {
  return path.replace(/\\/g, '/')
}

/**
 * 生成窗口URL路径
 * @param windowName - 窗口目录名
 * @returns 窗口路径
 */
export function getWindowPath(windowName: string): string {
  return `srcRenderer/windows/${windowName}/index.html`
}

/**
 * 获取完整的窗口URL（包含 file:// 协议）
 * @param windowName - 窗口目录名
 * @returns 完整的窗口URL
 */
export function getWindowUrl(windowName: string): string {
  const windowPath = getWindowPath(windowName)
  return `${BASE_ROOT_URL}/${windowPath}`
}

/**
 * 获取预加载脚本路径
 * @returns 预加载脚本路径
 */
export function getPreloadPath(type: 'external' | 'internal'): string {
  return type === 'external' ? externalWebPreloadPath : internalWebPreloadPath
}
/**
 * 获取应用图标的 file:// URL
 * @returns 应用图标URL
 */
export function getIconUrl(): string {
  const normalizedPath = normalizePathSlashes(ICON_PATH)
  return pathToFileURL(normalizedPath).href
}

/**
 * 测试路径格式化功能
 * @description 用于测试和调试路径格式化的功能
 */
export function testPathFormatting(): void {
  console.log('=== 路径格式化测试 ===')
  console.log('原始 DIST 路径:', DIST)
  console.log('标准化 DIST 路径:', normalizePathSlashes(DIST))
  console.log('基础根 URL:', BASE_ROOT_URL)
  console.log('窗口 URL (设置):', getWindowUrl('settings'))
  console.log('图标 URL:', getIconUrl())
  console.log('=== 测试结束 ===')
}

// ==================== 主题相关 ====================

/**
 * 判断是否是黑夜模式
 * @returns 是否为黑夜模式
 */
export function isDarkMode(): boolean {
  return systemState.state.theme === 'dark'
}

/**
 * 获取窗口背景颜色
 * @returns 窗口背景颜色
 */
export function getWindowBackgroundColor(): string {
  const globalTheme = systemState.state.theme
  const theme: 'dark' | 'light' = globalTheme === 'system' ? systemTheme.state! : globalTheme

  return theme === 'dark' ? '#424242' : '#F7F7F7'
}

// ==================== 窗口尺寸计算 ====================

/**
 * 窗口尺寸接口
 */
export interface WindowDimensions {
  width: number
  height: number
}

/**
 * 计算实际窗口尺寸
 * 处理最大化状态下的尺寸调整
 * @param mainWindow - 主窗口实例
 * @returns 计算后的窗口尺寸
 */
export function calculateWindowDimensions(mainWindow: BaseWindow): WindowDimensions {
  const [windowWidth, windowHeight] = mainWindow.getSize()

  if (mainWindow.isMaximized()) {
    return {
      width: windowWidth - 16, // 最大化时减去系统边框
      height: windowHeight - 16
    }
  }

  return {
    width: windowWidth,
    height: windowHeight
  }
}
